
// WARNING: [rz-ghidra] Failed to match type unknown_t for variable lpVersionInformation to Decompiler type: Unknown
// type identifier LPOSVERSIONINFOW
// WARNING: [rz-ghidra] Invalid atomic type LPWNDCLASSEXW
// WARNING: [rz-ghidra] Failed to match type LPWNDCLASSEXW for variable lpwcx to Decompiler type: Unknown type
// identifier LPWNDCLASSEXW
// WARNING: [rz-ghidra] Failed to match type LPWNDCLASSEXW for variable var_40h to Decompiler type: Unknown type
// identifier LPWNDCLASSEXW

// Redcomm.dll by Ghidra.
// Edited by DeepSeek.

#include <stdint.h>
#include <stdbool.h>
#include <wchar.h>
#include <string.h>

// 假设的全局缓冲区定义 (对应原始数据区)
wchar_t g_configBuffer1[256];  // 对应 data.100a0410 (piVar1)
wchar_t g_configBuffer2[256];  // 对应 data.100a0610 (arg_8h)
wchar_t g_configBuffer3[256];  // 对应 data.100a0810 (arg_ch)
wchar_t g_configBuffer4[256];  // 对应 data.100a0a10 (arg_10h)

// 假设的函数声明
bool RefreshCommEnvVar(int param1, int param2);  // 对应 FUN_RefreshCommEnvVar
bool Register3000softClass(int version);         // 对应 _Register3000softClass
void RefreshCommGlobalVar();                     // 对应 FUN_RefreshCommGlobalVar
void *UnknownFunction84768(const wchar_t *param1, const wchar_t *param2);  // 对应 (*(code *)0x84768)
void UnknownFunction84B9E(void *handle);         // 对应 (*(code *)0x84b9e)

// 全局句柄变量
void *g_commHandle = NULL;  // 对应 _data.1008dd78

// 重写后的函数
bool InitializeRedcomm(
    const wchar_t *devicePath,       // 对应 piVar1
    const wchar_t *configParam1,     // 对应 arg_8h
    const wchar_t *configParam2,     // 对应 arg_ch
    const wchar_t *configParam3)     // 对应 arg_10h
{
    // 复制设备路径到缓冲区 (对应原始循环逻辑)
    if (devicePath != NULL) {
        wcsncpy(g_configBuffer1, devicePath, sizeof(g_configBuffer1)/sizeof(wchar_t) - 1);
        g_configBuffer1[255] = L'\0'; // 确保字符串终止 (对应原始循环终止条件)
    }

    // 复制配置参数1到缓冲区 (对应原始循环逻辑)
    if (configParam1 != NULL) {
        wcsncpy(g_configBuffer2, configParam1, sizeof(g_configBuffer2)/sizeof(wchar_t) - 1);
        g_configBuffer2[255] = L'\0'; // 确保字符串终止
    }

    // 复制配置参数2到缓冲区 (对应原始循环逻辑)
    if (configParam2 != NULL) {
        wcsncpy(g_configBuffer3, configParam2, sizeof(g_configBuffer3)/sizeof(wchar_t) - 1);
        g_configBuffer3[255] = L'\0'; // 确保字符串终止
    }

    // 复制配置参数3到缓冲区 (对应原始循环逻辑)
    if (configParam3 != NULL) {
        wcsncpy(g_configBuffer4, configParam3, sizeof(g_configBuffer4)/sizeof(wchar_t) - 1);
        g_configBuffer4[255] = L'\0'; // 确保字符串终止
    }

    // 初始化通信环境变量 (对应 FUN_RefreshCommEnvVar)
    if (!RefreshCommEnvVar(0, 0)) {
        return false;
    }

    // 注册软件类 (对应 _Register3000softClass)
    if (!Register3000softClass(3)) {  // 3 对应原始参数
        return false;
    }

    // 刷新全局通信变量 (对应 FUN_RefreshCommGlobalVar)
    RefreshCommGlobalVar();

    // 清理现有句柄（如果存在）(对应原始清理逻辑)
    if (g_commHandle != NULL) {  // g_commHandle 对应 _data.1008dd78
        UnknownFunction84B9E(g_commHandle);  // 对应 (*(code *)0x84b9e)
        g_commHandle = NULL;
    }

    // 创建新通信句柄 (对应原始创建逻辑)
    g_commHandle = UnknownFunction84768(g_configBuffer1, L"HAND");  // 对应 (*(code *)0x84768)
    if (g_commHandle == NULL) {
        return false;
    }

    return true;  // 对应原始返回1表示成功
}